package portal.action.rest;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import portal.common.MyStringUtils;
import portal.common.ResultData;
import portal.conf.ProcessConf;
import portal.conf.entity.BaseConf;
import portal.conf.entity.QueueEntity;

/************************************************************************************
 * @author 徐文远
 * @since  2018-08-01
 * Action 遵循 RestFul 操作规范
 * GET  查询
 * POST 新增/功能操作
 * PUT  全量更新
 * PATCH 部分更新
 * DELETE 删除
 * **********************************************************************************/
@RestController
//@RequestMapping(value="/conf")
public class QueueAction extends BaseAction{
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value="/queues",method=RequestMethod.GET)
	/********************
	 * 检索所有QUEUE 信息
	 * ********************/
	public List<QueueEntity> queuesList(){
		//Log4jInit.logger.info("----------------------------get /conf/queues");
		return (List<QueueEntity>)((List)queueConf.selectAllConf());		//return null;
	}
	
	/***********************
	 * 根据QueueName查询队列基本信息
	 * @param queueName 待获取的QueueName
	 * @return 返回查询到的结果 
	 * *******************/
	@RequestMapping(value="/queues/{queueName}",method=RequestMethod.GET)
	public ResultData getQueueByName(@PathVariable("queueName")String queueName){
		BaseConf bConf=queueConf.findConfByName(queueName);
		if(bConf!=null){
			return success(bConf);
		}
		return error();
	}

	/**********************
	 * 根据名字获取删除指定QUEUE
	 * @param queueName 待删除的队列名
	 * @return 返回操作结果
	 * *********************/
	@RequestMapping(value="/queues/{queueName}",method=RequestMethod.DELETE)
	public ResultData queueDelete(@PathVariable String queueName){
		//Log4jInit.logger.info("----------------------------"+queueName);
		BaseConf bConf =queueConf.findConfByName(queueName);
		if(bConf==null)return error("未找到指定的队列，队列不存在或已被他人删除");
		boolean ret = queueConf.removeConf(queueName);
		if(ret){
			ret=jHCmd.jSchedReconfig();
			if(ret){
				//fanoutConf(queueConf);
				return success();
			}
			//调度命令执行失败，恢复已删除的内容
			queueConf.insertConf(bConf);
		}
		return error();
	}	

	/**************
	 * 更新QUEUE
	 * @param 待更新的内容
	 *****************/
	@RequestMapping(value="/queues/{queueName}",method=RequestMethod.PUT)
	public ResultData queueUpdateFull(QueueEntity queue){
		//保存原有队列信息
		BaseConf bConf =queueConf.findConfByName(queue.getQUEUE_NAME());
		if(bConf==null)
			return error("无效的队列信息");
		//更新Queue信息
		//procConf.insertConf(queue.getLIMITED_PROCESS());
		//移除旧的队列信息		
		boolean ret=queueConf.removeConf(queue.getQUEUE_NAME());
		if(ret){
			//写入更新后的新的队列信息
			ret=queueConf.insertConf(queue);
			if(ret){
				//通知调度平台更新
				ret=jHCmd.jSchedReconfig();
				if(ret){
					//通知节点修改信息
					//fanoutConf(queueConf);
					return success();
				}
				queueConf.insertConf(bConf);
			}
		}
		return error();
	}

	/****************************
	 * @author Xu WenYuan
	 * @param queueName ,待操作的队列名称
	 * @param oper ,待执行的操作，close：关闭队列；open:打开队列
	 * @return 操作结果
	 * **************************/
	@RequestMapping(value="/queues/{queueName}/{oper}",method=RequestMethod.POST)
	public ResultData operQueue(@PathVariable("queueName") String queueName,@PathVariable("oper") String oper){
		if(jHCmd.queueOper(queueName,oper))
			return success();
		return error();
	}	
	
	/***************************
	 * 添加QUEUE
	 * @param queue 被添加的queue
	 * @return 返回操作结果
	 * *************************/
	@RequestMapping(value="/queues",method=RequestMethod.POST)
	public ResultData queueAdd(QueueEntity queue){
		if(MyStringUtils.isBlank(queue.getKey()))
			return error("无效的队列名");
		queue.setPOST_EXEC("c:/unischeduler/bin/jobstart/post_cmd.bat");
		queue.setJOB_STARTER("c:/unischeduler/bin/jobstart/jhexec_cmd.bat");
		//procConf.insertConf(queue.getLIMITED_PROCESS());
		boolean result=queueConf.insertConf(queue);
		if(result){
			result=jHCmd.jSchedReconfig();
			if(result){
				//fanoutConf(queueConf);
				return success();
			}
			queueConf.removeConf(queue.getKey());
			return error("后台更新失败");
		}
		return error("添加队列失败（添加出错或这队列名已存在）。");
		//return getQueueByName(queue.getQUEUE_NAME());
	}
	
}
